Link about it: http://www2.camara.leg.br/transparencia/acesso-a-informacao/copy_of_perguntas-frequentes/cota-para-o-exercicio-da-atividade-parlamentar
For this lab we gonna need the following package to be installed
#install.packages("ggplot2")
#install.packages("dplyr")
#install.packages("tidyr")
#install.packages("scales")
#install.packages("plotly")
Loading the libraries
library(ggplot2)
library(dplyr)
library(tidyr)
library(scales)
library(plotly)
Set up the workspace folder
setwd("~/git/data-analysis/Lab01")
Loading the data
data <- read.csv(("/home/josemsf/Downloads/dadosCEAP.csv"))
montly_limit <- read.csv(("/home/josemsf/Downloads/limiteMensalCEAP.csv"))
data$valorGlosa <- as.numeric(sub(",", ".", data$valorGlosa, fixed = TRUE))
data %>%
full_join(montly_limit, by=c("sgUF" = "UF")) -> data
Which deputies have expeended more money from CEAP? Which are the most economic?
Here we have two graphics that show the top 10 deputies that have expeended more money and the top 10 more economic.
greater_expenses <- data %>%
group_by(nomeParlamentar) %>%
filter(valorLíquido >= 0) %>%
summarise(dep_expenses = sum(valorLíquido))
greater_expenses <- greater_expenses[order(greater_expenses$dep_expenses),]
filter_expensies <- rbind(tail(greater_expenses, 10))
ggplot(filter_expensies, aes(y = dep_expenses, x = reorder(nomeParlamentar, dep_expenses)), top_n(x, 10)) + order(decreasing = TRUE) + scale_y_continuous(labels = comma) +
geom_bar(stat="identity") +
labs(title = "The Deputies That Have Expeended More Money",
x = "Deputies", y = "Expenses in RS") +
coord_flip()

Here we can see 10 deputies that have expeend more money which are:
-
Edio Lopes: RS 1648666
-
Rocha: RS 1526395
-
Abel Mesquita Junior: RS 1470778
-
Alan Rick: RS 1464612
-
Jhonatan de Jesus: RS 1463513
filter_expensies_minors <- rbind(head(greater_expenses, 10))
ggplot(filter_expensies_minors, aes(y = dep_expenses, x = reorder(nomeParlamentar, dep_expenses)), top_n(x, 10)) + order(decreasing = TRUE) + scale_y_continuous(labels = comma) +
geom_bar(stat="identity") +
labs(title = "The Deputies That Have Expended Less Money",
x = "Deputies", y = "Expenses in RS") +
coord_flip()

Now those are the ones who have expeended less money:
-
Camilo Cola: RS 0.62
-
Eliseu Padilha: RS 5.31
-
Marcio Monteiro: RS 14.18
-
Marcelo Almeida: RS 26.16
-
Renan Filho: RS 35.51
Which are the states that its deputies have more expenses abroad? Which are the states that its deputies have expended less abroad?
expending_abord <- data %>%
group_by(sgUF) %>%
filter(tipoDocumento == 2, valorLíquido >= 0) %>%
summarise(expense = sum(valorLíquido))
expending_abord <- expending_abord[order(expending_abord$expense),]
expending_abord$sgUF <- factor(expending_abord$sgUF, levels = expending_abord$sgUF[order(expending_abord$expense)])
ggplot(expending_abord, aes(x = sgUF, y = expense)) + theme_bw() + geom_bar(stat = "identity") +
scale_y_continuous(labels = comma) +
geom_bar(stat="identity") +
labs(title = "The Deputies That Have Expeended Less Money Abroad",
x = "Deputies", y = "Expenses in RS") +
coord_flip()

As we can see the hilight is São Paulo which have been the most expenses to abroad whit RS 102366.56 followed by Minas Gerais whit RS 79767.77 and Pernambuco whit RS 70915.94. And alse we hilight Maranhão that have been expended only RS 40.99 and Paraíba whit RS 2288.29..
Which are the political groups that its deputies most use CEAP in the state of Paraíba? Which are the less use it?
expense_by_group <- data %>%
group_by(sgPartido) %>%
filter(valorLíquido >= 0, sgUF == "PB") %>%
summarise(expense = sum(abs(valorLíquido)))
expense_by_group$sgUF <- factor(expense_by_group$sgPartido, levels = expense_by_group$sgPartido[order(expense_by_group$expense)])
ggplot(expense_by_group, aes(y = expense, x = reorder(sgPartido, expense))) + order(decreasing = TRUE) + scale_y_continuous(labels = comma) +
geom_bar(stat="identity") +
labs(title = "Grups Expenses",
x = "Grups", y = "Expenses in RS") +
coord_flip()

PMDB is the group that most uses CEP whit a value of RS 4011621.34 followed by PR whit RS 1434506.56
Which are the deputies, by state, that most pass the CEAP limit??
limit_exceeded <- data %>%
mutate(ano = substr(dataEmissao, 1, 4)) %>%
mutate(mes = substr(dataEmissao, 6, 7)) %>%
group_by(nomeParlamentar, limite_mensal, mes, ano) %>%
filter(valorLíquido >= 0) %>%
summarise(expense = sum(valorLíquido)) %>%
filter(expense > limite_mensal)
limit_exceeded <- limit_exceeded %>%
group_by(nomeParlamentar) %>%
summarise(times_exceeded = n())
limit_exceeded <- limit_exceeded[order(limit_exceeded$times_exceeded, decreasing = TRUE),]
limit_exceeded$indexGasto <- factor(limit_exceeded$nomeParlamentar, levels = limit_exceeded$nomeParlamentar)
limit_exceeded %>%
plot_ly(x= ~indexGasto, y= ~times_exceeded,type= "scatter", mode= "lines+markers") %>%
layout(title="Number of time the deputies have exceeded the monthly limit of expenses",
xaxis=list(title="Deputies", range= c(0,10)),
yaxis=list(title="Times of limit exceeded"), barmode="stack")
Our data show that at least one deputie have passed his state CEAP limit, but ther are some most frequent, which are:
-
Felipe Bornier
-
Domingos Neto
-
Jandira Feghali
-
Paulo Abi-Ackel
-
Rômulo Goveia
Which are the states whit more expense in airline tickets?
We are going to look only to expenses whit the description about airline tickes, once whit that information we will sum all values by states.
flyies_expenses <- data %>%
group_by(sgUF) %>%
filter(tipoDespesa == "Emissão Bilhete Aéreo", valorLíquido >= 0) %>%
summarise(expense = sum(valorLíquido))
flyies_expenses$sgUF <- factor(flyies_expenses$sgUF, levels = flyies_expenses$sgUF[order(flyies_expenses$expense)])
ggplot(flyies_expenses, aes(x = sgUF, y = expense)) + theme_bw() + geom_bar(stat = "identity") + scale_y_continuous(labels = comma) +
labs(title = "State whit its epenses whit airline tickets",
x = "Value in RS", y = "State")

So what we’ve got it São Paulo is the state that expend more money then the other whit ailine ticket, and the total expeended was about RS 23171817.73 and Rio de Janeiro whit RS16755188.64
LS0tCnRpdGxlOiAiRGVwdXRpZXMgRXhwZW5kaXR1cmVzIEFuYWx5c2lzOiBPdXIgUXVlc3Rpb25zIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiAiSm9zw6kgTWFub2VsIEZlcnJlaXJhIgotLS0KCkxpbmsgYWJvdXQgaXQ6IGh0dHA6Ly93d3cyLmNhbWFyYS5sZWcuYnIvdHJhbnNwYXJlbmNpYS9hY2Vzc28tYS1pbmZvcm1hY2FvL2NvcHlfb2ZfcGVyZ3VudGFzLWZyZXF1ZW50ZXMvY290YS1wYXJhLW8tZXhlcmNpY2lvLWRhLWF0aXZpZGFkZS1wYXJsYW1lbnRhciAKCkZvciB0aGlzIGxhYiB3ZSBnb25uYSBuZWVkIHRoZSBmb2xsb3dpbmcgcGFja2FnZSB0byBiZSBpbnN0YWxsZWQKYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikKI2luc3RhbGwucGFja2FnZXMoImRwbHlyIikKI2luc3RhbGwucGFja2FnZXMoInRpZHlyIikKI2luc3RhbGwucGFja2FnZXMoInNjYWxlcyIpCiNpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQpgYGAKCkxvYWRpbmcgdGhlIGxpYnJhcmllcwpgYGB7cn0KIGxpYnJhcnkoZ2dwbG90MikKIGxpYnJhcnkoZHBseXIpCiBsaWJyYXJ5KHRpZHlyKQogbGlicmFyeShzY2FsZXMpCiBsaWJyYXJ5KHBsb3RseSkKCmBgYAoKU2V0IHVwIHRoZSB3b3Jrc3BhY2UgZm9sZGVyCgpgYGB7cn0Kc2V0d2QoIn4vZ2l0L2RhdGEtYW5hbHlzaXMvTGFiMDEiKQpgYGAKCkxvYWRpbmcgdGhlIGRhdGEKCmBgYHtyfQpkYXRhIDwtIHJlYWQuY3N2KCgiL2hvbWUvam9zZW1zZi9Eb3dubG9hZHMvZGFkb3NDRUFQLmNzdiIpKQptb250bHlfbGltaXQgPC0gcmVhZC5jc3YoKCIvaG9tZS9qb3NlbXNmL0Rvd25sb2Fkcy9saW1pdGVNZW5zYWxDRUFQLmNzdiIpKQpkYXRhJHZhbG9yR2xvc2EgPC0gYXMubnVtZXJpYyhzdWIoIiwiLCAiLiIsIGRhdGEkdmFsb3JHbG9zYSwgZml4ZWQgPSBUUlVFKSkgCmRhdGEgJT4lIAogIGZ1bGxfam9pbihtb250bHlfbGltaXQsIGJ5PWMoInNnVUYiID0gIlVGIikpIC0+IGRhdGEKYGBgCgojIyNXaGljaCBkZXB1dGllcyBoYXZlIGV4cGVlbmRlZCBtb3JlIG1vbmV5IGZyb20gQ0VBUD8gV2hpY2ggYXJlIHRoZSBtb3N0IGVjb25vbWljPwoKPHA+SGVyZSB3ZSBoYXZlIHR3byBncmFwaGljcyB0aGF0IHNob3cgdGhlIHRvcCAxMCBkZXB1dGllcyB0aGF0IGhhdmUgZXhwZWVuZGVkIG1vcmUgbW9uZXkgYW5kIHRoZSB0b3AgMTAgbW9yZSBlY29ub21pYy48L3A+CgpgYGB7cn0KCmdyZWF0ZXJfZXhwZW5zZXMgPC0gZGF0YSAlPiUgCiAgZ3JvdXBfYnkobm9tZVBhcmxhbWVudGFyKSAlPiUKICBmaWx0ZXIodmFsb3JMw61xdWlkbyA+PSAwKSAlPiUKICBzdW1tYXJpc2UoZGVwX2V4cGVuc2VzID0gc3VtKHZhbG9yTMOtcXVpZG8pKQoKZ3JlYXRlcl9leHBlbnNlcyA8LSBncmVhdGVyX2V4cGVuc2VzW29yZGVyKGdyZWF0ZXJfZXhwZW5zZXMkZGVwX2V4cGVuc2VzKSxdCgpmaWx0ZXJfZXhwZW5zaWVzIDwtIHJiaW5kKHRhaWwoZ3JlYXRlcl9leHBlbnNlcywgMTApKQpnZ3Bsb3QoZmlsdGVyX2V4cGVuc2llcywgYWVzKHkgPSBkZXBfZXhwZW5zZXMsIHggPSByZW9yZGVyKG5vbWVQYXJsYW1lbnRhciwgZGVwX2V4cGVuc2VzKSksIHRvcF9uKHgsIDEwKSkgKyBvcmRlcihkZWNyZWFzaW5nID0gVFJVRSkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICBsYWJzKHRpdGxlID0gIlRoZSBEZXB1dGllcyBUaGF0IEhhdmUgRXhwZWVuZGVkIE1vcmUgTW9uZXkiLAogICAgICAgeCA9ICJEZXB1dGllcyIsIHkgPSAiRXhwZW5zZXMgaW4gUlMiKSArCiAgY29vcmRfZmxpcCgpIAoKCmBgYAoKPHA+SGVyZSB3ZSBjYW4gc2VlIDEwIGRlcHV0aWVzIHRoYXQgaGF2ZSBleHBlZW5kIG1vcmUgbW9uZXkgd2hpY2ggYXJlOjwvcD4KCjx1bD4KICA8bGk+RWRpbyBMb3BlczogUlMgMTY0ODY2NiA8L2xpPgogIDxsaT5Sb2NoYTogUlMgMTUyNjM5NTwvbGk+CiAgPGxpPkFiZWwgTWVzcXVpdGEgSnVuaW9yOiBSUyAxNDcwNzc4PC9saT4KICA8bGk+QWxhbiBSaWNrOiBSUyAxNDY0NjEyPC9saT4KICA8bGk+SmhvbmF0YW4gZGUgSmVzdXM6IFJTIDE0NjM1MTM8L2xpPgo8L3VsPgoKCmBgYHtyfQpmaWx0ZXJfZXhwZW5zaWVzX21pbm9ycyA8LSByYmluZChoZWFkKGdyZWF0ZXJfZXhwZW5zZXMsIDEwKSkKZ2dwbG90KGZpbHRlcl9leHBlbnNpZXNfbWlub3JzLCBhZXMoeSA9IGRlcF9leHBlbnNlcywgeCA9IHJlb3JkZXIobm9tZVBhcmxhbWVudGFyLCBkZXBfZXhwZW5zZXMpKSwgdG9wX24oeCwgMTApKSArIG9yZGVyKGRlY3JlYXNpbmcgPSBUUlVFKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIGxhYnModGl0bGUgPSAiVGhlIERlcHV0aWVzIFRoYXQgSGF2ZSBFeHBlbmRlZCBMZXNzIE1vbmV5IiwKICAgICAgIHggPSAiRGVwdXRpZXMiLCB5ID0gIkV4cGVuc2VzIGluIFJTIikgKwogIGNvb3JkX2ZsaXAoKSAKYGBgCjxwPk5vdyB0aG9zZSBhcmUgdGhlIG9uZXMgd2hvIGhhdmUgZXhwZWVuZGVkIGxlc3MgbW9uZXk6PC9wPgoKPHVsPgogIDxsaT5DYW1pbG8gQ29sYTogUlMgMC42MiA8L2xpPgogIDxsaT5FbGlzZXUgUGFkaWxoYTogUlMgNS4zMTwvbGk+CiAgPGxpPk1hcmNpbyBNb250ZWlybzogUlMgMTQuMTg8L2xpPgogIDxsaT5NYXJjZWxvIEFsbWVpZGE6IFJTIDI2LjE2PC9saT4KICA8bGk+UmVuYW4gRmlsaG86IFJTIDM1LjUxPC9saT4KPC91bD4KCgojIyNXaGljaCBhcmUgdGhlIHN0YXRlcyB0aGF0IGl0cyBkZXB1dGllcyBoYXZlIG1vcmUgZXhwZW5zZXMgYWJyb2FkPyBXaGljaCBhcmUgdGhlIHN0YXRlcyB0aGF0IGl0cyBkZXB1dGllcyBoYXZlIGV4cGVuZGVkIGxlc3MgYWJyb2FkPwoKYGBge3J9CmV4cGVuZGluZ19hYm9yZCA8LSBkYXRhICU+JQogIGdyb3VwX2J5KHNnVUYpICU+JQogIGZpbHRlcih0aXBvRG9jdW1lbnRvID09IDIsIHZhbG9yTMOtcXVpZG8gPj0gMCkgJT4lCiAgc3VtbWFyaXNlKGV4cGVuc2UgPSBzdW0odmFsb3JMw61xdWlkbykpCgpleHBlbmRpbmdfYWJvcmQgPC0gZXhwZW5kaW5nX2Fib3JkW29yZGVyKGV4cGVuZGluZ19hYm9yZCRleHBlbnNlKSxdCgpleHBlbmRpbmdfYWJvcmQkc2dVRiA8LSBmYWN0b3IoZXhwZW5kaW5nX2Fib3JkJHNnVUYsIGxldmVscyA9IGV4cGVuZGluZ19hYm9yZCRzZ1VGW29yZGVyKGV4cGVuZGluZ19hYm9yZCRleHBlbnNlKV0pCmdncGxvdChleHBlbmRpbmdfYWJvcmQsIGFlcyh4ID0gc2dVRiwgeSA9IGV4cGVuc2UpKSArIHRoZW1lX2J3KCkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICBsYWJzKHRpdGxlID0gIlRoZSBEZXB1dGllcyBUaGF0IEhhdmUgRXhwZWVuZGVkIExlc3MgTW9uZXkgQWJyb2FkIiwKICAgICAgIHggPSAiRGVwdXRpZXMiLCB5ID0gIkV4cGVuc2VzIGluIFJTIikgKwogIGNvb3JkX2ZsaXAoKSAKCmBgYApBcyB3ZSBjYW4gc2VlIHRoZSBoaWxpZ2h0IGlzIFPDo28gUGF1bG8gd2hpY2ggaGF2ZSBiZWVuIHRoZSBtb3N0IGV4cGVuc2VzIHRvIGFicm9hZCB3aGl0IFJTIDEwMjM2Ni41NiBmb2xsb3dlZCBieSBNaW5hcyBHZXJhaXMgd2hpdCBSUyA3OTc2Ny43NwphbmQgUGVybmFtYnVjbyB3aGl0IFJTIDcwOTE1Ljk0LiBBbmQgYWxzZSB3ZSBoaWxpZ2h0IE1hcmFuaMOjbyB0aGF0IGhhdmUgYmVlbiBleHBlbmRlZCBvbmx5IFJTIDQwLjk5IGFuZCBQYXJhw61iYSB3aGl0IFJTIDIyODguMjkuLgoKIyMjV2hpY2ggYXJlIHRoZSBwb2xpdGljYWwgZ3JvdXBzIHRoYXQgaXRzIGRlcHV0aWVzIG1vc3QgdXNlIENFQVAgaW4gdGhlIHN0YXRlIG9mIFBhcmHDrWJhPyBXaGljaCBhcmUgdGhlIGxlc3MgdXNlIGl0PwoKCmBgYHtyfQpleHBlbnNlX2J5X2dyb3VwIDwtIGRhdGEgJT4lCiAgZ3JvdXBfYnkoc2dQYXJ0aWRvKSAlPiUKICBmaWx0ZXIodmFsb3JMw61xdWlkbyA+PSAwLCBzZ1VGID09ICJQQiIpICU+JQogIHN1bW1hcmlzZShleHBlbnNlID0gc3VtKGFicyh2YWxvckzDrXF1aWRvKSkpCgpleHBlbnNlX2J5X2dyb3VwJHNnVUYgPC0gZmFjdG9yKGV4cGVuc2VfYnlfZ3JvdXAkc2dQYXJ0aWRvLCBsZXZlbHMgPSBleHBlbnNlX2J5X2dyb3VwJHNnUGFydGlkb1tvcmRlcihleHBlbnNlX2J5X2dyb3VwJGV4cGVuc2UpXSkKZ2dwbG90KGV4cGVuc2VfYnlfZ3JvdXAsIGFlcyh5ID0gZXhwZW5zZSwgeCA9IHJlb3JkZXIoc2dQYXJ0aWRvLCBleHBlbnNlKSkpICsgb3JkZXIoZGVjcmVhc2luZyA9IFRSVUUpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgbGFicyh0aXRsZSA9ICJHcnVwcyBFeHBlbnNlcyIsCiAgICAgICB4ID0gIkdydXBzIiwgeSA9ICJFeHBlbnNlcyBpbiBSUyIpICsKICBjb29yZF9mbGlwKCkgCmBgYAo8cD5QTURCIGlzIHRoZSBncm91cCB0aGF0IG1vc3QgdXNlcyBDRVAgd2hpdCBhIHZhbHVlIG9mIFJTIDQwMTE2MjEuMzQgZm9sbG93ZWQgYnkgUFIgd2hpdCBSUyAxNDM0NTA2LjU2PC9wPgoKIAojIyNXaGljaCBhcmUgdGhlIGRlcHV0aWVzLCBieSBzdGF0ZSwgdGhhdCBtb3N0IHBhc3MgdGhlIENFQVAgbGltaXQ/PwoKYGBge3J9CgpsaW1pdF9leGNlZWRlZCA8LSBkYXRhICU+JQogIG11dGF0ZShhbm8gPSAgc3Vic3RyKGRhdGFFbWlzc2FvLCAxLCA0KSkgJT4lCiAgbXV0YXRlKG1lcyA9ICBzdWJzdHIoZGF0YUVtaXNzYW8sIDYsIDcpKSAlPiUKICBncm91cF9ieShub21lUGFybGFtZW50YXIsIGxpbWl0ZV9tZW5zYWwsIG1lcywgYW5vKSAlPiUKICBmaWx0ZXIodmFsb3JMw61xdWlkbyA+PSAwKSAlPiUKICBzdW1tYXJpc2UoZXhwZW5zZSA9IHN1bSh2YWxvckzDrXF1aWRvKSkgJT4lCiAgZmlsdGVyKGV4cGVuc2UgPiBsaW1pdGVfbWVuc2FsKQoKbGltaXRfZXhjZWVkZWQgPC0gbGltaXRfZXhjZWVkZWQgJT4lCiAgZ3JvdXBfYnkobm9tZVBhcmxhbWVudGFyKSAlPiUKICBzdW1tYXJpc2UodGltZXNfZXhjZWVkZWQgPSBuKCkpCgpsaW1pdF9leGNlZWRlZCA8LSBsaW1pdF9leGNlZWRlZFtvcmRlcihsaW1pdF9leGNlZWRlZCR0aW1lc19leGNlZWRlZCwgZGVjcmVhc2luZyA9IFRSVUUpLF0KbGltaXRfZXhjZWVkZWQkaW5kZXhHYXN0byA8LSBmYWN0b3IobGltaXRfZXhjZWVkZWQkbm9tZVBhcmxhbWVudGFyLCBsZXZlbHMgPSBsaW1pdF9leGNlZWRlZCRub21lUGFybGFtZW50YXIpCgpsaW1pdF9leGNlZWRlZCAlPiUKICBwbG90X2x5KHg9IH5pbmRleEdhc3RvLCB5PSB+dGltZXNfZXhjZWVkZWQsdHlwZT0gInNjYXR0ZXIiLCBtb2RlPSAibGluZXMrbWFya2VycyIpICU+JQogIGxheW91dCh0aXRsZT0iTnVtYmVyIG9mIHRpbWUgdGhlIGRlcHV0aWVzIGhhdmUgZXhjZWVkZWQgdGhlIG1vbnRobHkgbGltaXQgb2YgZXhwZW5zZXMiLCAKICAgICAgICAgeGF4aXM9bGlzdCh0aXRsZT0iRGVwdXRpZXMiLCByYW5nZT0gYygwLDEwKSksIAogICAgICAgICB5YXhpcz1saXN0KHRpdGxlPSJUaW1lcyBvZiBsaW1pdCBleGNlZWRlZCIpLCBiYXJtb2RlPSJzdGFjayIpCmBgYAo8cD5PdXIgZGF0YSBzaG93IHRoYXQgYXQgbGVhc3Qgb25lIGRlcHV0aWUgaGF2ZSBwYXNzZWQgaGlzIHN0YXRlIENFQVAgbGltaXQsIGJ1dCB0aGVyIGFyZSBzb21lIG1vc3QgZnJlcXVlbnQsIHdoaWNoIGFyZTo8L3A+Cjx1bD4KICA8bGk+RmVsaXBlIEJvcm5pZXIgPC9saT4KICA8bGk+RG9taW5nb3MgTmV0bzwvbGk+CiAgPGxpPkphbmRpcmEgRmVnaGFsaTwvbGk+CiAgPGxpPlBhdWxvIEFiaS1BY2tlbDwvbGk+CiAgPGxpPlLDtG11bG8gR292ZWlhPC9saT4KPC91bD4KCgojIyNXaGljaCBhcmUgdGhlIHN0YXRlcyB3aGl0IG1vcmUgZXhwZW5zZSBpbiBhaXJsaW5lIHRpY2tldHM/CgpXZSBhcmUgZ29pbmcgdG8gbG9vayBvbmx5IHRvIGV4cGVuc2VzIHdoaXQgdGhlIGRlc2NyaXB0aW9uIGFib3V0IGFpcmxpbmUgdGlja2VzLCBvbmNlIHdoaXQgdGhhdCBpbmZvcm1hdGlvbiB3ZSB3aWxsIHN1bSBhbGwgdmFsdWVzIGJ5IHN0YXRlcy4KCmBgYHtyfQpmbHlpZXNfZXhwZW5zZXMgPC0gZGF0YSAlPiUKICBncm91cF9ieShzZ1VGKSAlPiUKICBmaWx0ZXIodGlwb0Rlc3Blc2EgPT0gIkVtaXNzw6NvIEJpbGhldGUgQcOpcmVvIiwgdmFsb3JMw61xdWlkbyA+PSAwKSAlPiUKICBzdW1tYXJpc2UoZXhwZW5zZSA9IHN1bSh2YWxvckzDrXF1aWRvKSkKCmZseWllc19leHBlbnNlcyRzZ1VGIDwtIGZhY3RvcihmbHlpZXNfZXhwZW5zZXMkc2dVRiwgbGV2ZWxzID0gZmx5aWVzX2V4cGVuc2VzJHNnVUZbb3JkZXIoZmx5aWVzX2V4cGVuc2VzJGV4cGVuc2UpXSkKZ2dwbG90KGZseWllc19leHBlbnNlcywgYWVzKHggPSBzZ1VGLCB5ID0gZXhwZW5zZSkpICsgdGhlbWVfYncoKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKwogIGxhYnModGl0bGUgPSAiU3RhdGUgd2hpdCBpdHMgZXBlbnNlcyB3aGl0IGFpcmxpbmUgdGlja2V0cyIsCiAgICAgICB4ID0gIlZhbHVlIGluIFJTIiwgeSA9ICJTdGF0ZSIpCmBgYAoKU28gd2hhdCB3ZSd2ZSBnb3QgaXQgU8OjbyBQYXVsbyBpcyB0aGUgc3RhdGUgdGhhdCBleHBlbmQgbW9yZSBtb25leSB0aGVuIHRoZSBvdGhlciB3aGl0IGFpbGluZSB0aWNrZXQsIGFuZCB0aGUgdG90YWwgZXhwZWVuZGVkIHdhcyBhYm91dCBSUyAyMzE3MTgxNy43MyBhbmQgUmlvIGRlIEphbmVpcm8gd2hpdCBSUzE2NzU1MTg4LjY0CgojIyNDaG9zZSB0aHJlZSBncm91cHMgYW5kIGFuc3dlcjogd2hpY2ggYXJlIHRoZSBtb3N0IHVzZWQgZXhwZW5zZXMgaW4gQ0VBUCBieSB0aGUgZGVwdXRpZXMgZm9ybSB0aG9zZSBncm91cHM/CgpHb25uYSBjaG9zZSBQTURCLCBQVCBhbmQgREVNIGFuZCB0YWtlIGEgY2xvc2UgbG9vayBpbiBpdHMgZXhwZW5zZXMuCgpgYGB7cn0KZXhwZW5zZV9tb3N0X3JlcXVpcmVkIDwtIGRhdGEgJT4lCiAgZ3JvdXBfYnkodGlwb0Rlc3Blc2EpICU+JQogIGZpbHRlcihzZ1BhcnRpZG8gJWluJSBjKCJQTURCIiwgIlBUIiwgIkRFTSIpLCB2YWxvckzDrXF1aWRvID49IDApICU+JQogIHN1bW1hcmlzZShleHBlbnNlID0gc3VtKHZhbG9yTMOtcXVpZG8pKQoKZXhwZW5zZV9tb3N0X3JlcXVpcmVkJHRpcG9EZXNwZXNhIDwtIGZhY3RvcihleHBlbnNlX21vc3RfcmVxdWlyZWQkdGlwb0Rlc3Blc2EsIGxldmVscyA9IGV4cGVuc2VfbW9zdF9yZXF1aXJlZCR0aXBvRGVzcGVzYVtvcmRlcihleHBlbnNlX21vc3RfcmVxdWlyZWQkZXhwZW5zZSldKQoKZ2dwbG90KGV4cGVuc2VfbW9zdF9yZXF1aXJlZCwgYWVzKHkgPSBleHBlbnNlLCB4ID0gcmVvcmRlcih0aXBvRGVzcGVzYSwgZXhwZW5zZSkpLCB0b3Bfbih4LCAxMCkpICsgb3JkZXIoZGVjcmVhc2luZyA9IFRSVUUpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICBsYWJzKHRpdGxlID0gIkV4cGVuc2VzIGJ5IHRoZSBncm91cHMgUE1EQiwgUFQgYW5kIERFTSIsCiAgICAgICB5ID0gIkV4cGVuc2VzIGluIFJTIiwgeCA9ICJUeXBlIG9mIGV4cGVuc2VzIikgKwogIGNvb3JkX2ZsaXAoKSAKCmBgYAoxMiBkaWZlcmVudGVzIHR5cGVzIG9mIGV4cGVuc2VzIGFuZCBhcyBmYXIgd2UgY2FuIHNlZSB0aGUgbW9zdCBleHBlbnNpY2UgaXMgYWlybGluZSB0aWNrZXRzIHdoaXQgUlMgNDczNTMxODkuNjIgYW5kIHZlcnkgbmVhciB3ZSBnb3QgZGVwdXRpZXMgYWN0aXZpdGllcyBwdWJsaWNpdGllcyB3aGl0IFJTIDQwMTE5NDgwLjMzLgo=